﻿using System;
using System.Text;
using System.Drawing;
using System.Buffers;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;

public static partial class glDRIVE
{
    /*
    函数 gl.gjfq
    全区间积分双边法
    f计算微分方程组中各方程右端函数值的函数名。
    void gjfq(double t, double h, int n, double y[], double eps, int k, double z[], void (*f)(double,double [],int,double []))
    参数 t: 积分起始点。
    参数 h: 积分步长。
    参数 n: 一阶微分方程组中方程个数，也是未知函数个数。
    参数 y: y[n]存放n个未知函数在起始点t处的函数值。
    参数 eps: 变步长Runge_Kutta法的控制精度要求。
    参数 k: 积分步数（包括起始点这一步）。
    参数 z: z[n][k]返回k个积分点（包括起始点）上的未知函数值。
    */

    public static unsafe string drive_gjfq()
    {
        int i, j;
        double[] y = new double[2];
        double[,] z = new double[2, 11];
        double t, h, eps;

        t = 0.0;
        h = 0.1;
        eps = 0.0000001;
        y[0] = 1.0;
        y[1] = 0.0;
        gl.f_x_ya_n_da = gjfqf;
        gl.gjfq(t, h, 2, y, eps, 11, z);

        string rs = "";
        rs += gl.html_table("全区间积分双边法，存放n个未知函数在起始点t处的函数值 y", y);
        rs += gl.html_table("返回k个积分点（包括起始点）上的未知函数值 z", z);
        return rs;
    }

    // 计算微分方程组中各方程右端函数值
    private static unsafe void gjfqf(double t, double* y, int n, double* d)
    {
        //t=t; n=n;
        d[0] = -y[1];
        d[1] = y[0];
        return;
    }
}